package com.yuexun.concurrency.singletom;
import com.yuexun.concurrency.annoations.ThreadSafe;
import lombok.extern.slf4j.Slf4j;

/*
* 双重同步锁单例模式
* JVM和CPU优化,发生指令重排导致多线程不安全,通过volatile限制指令重排解决*/
@Slf4j
@ThreadSafe
public class SingletonSafeFaster {
    //只有构造函数私有了,外面才不能不断通过new来创造新的对象
    private SingletonSafeFaster(){
    }
    //定义一个单例对象,每次使用对象只能返回这一个,volatile+双重检测机制来限制指令重排
    private volatile static SingletonSafeFaster index =  null;
    public static SingletonSafeFaster getIndex(){
        if(index == null) {//双重检测机制,完成对实例的处理.
            synchronized (SingletonSafeFaster.class) {
                if(index == null)
                index = new SingletonSafeFaster();
            }
        }
        //恶汉模式,直接return,不需要判断
        return index;
    }

}

